package com.tiankun.eurekaadmin.controller;

import com.tiankun.eurekaadmin.exception.CustomerException;
import com.tiankun.eurekaadmin.util.JsonResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.Map;
import java.util.UUID;

/**
 * @program: Spring_myBatis
 * @description: 上传
 * @author: Tirion
 * @create: 2020-09-17 15:19
 **/
@RestController
@RequestMapping("/upload")
public class UploadController {

    //HttpServletRequest为了获取Context,从而获取"/"真实路径
    @PostMapping(value = "/upload")
    public Map<String, Object> upload(@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request) throws CustomerException {

        if (multipartFile.isEmpty()) {
            throw new CustomerException("上传图片为空");
        }

        //全局异常捕获大小超过1m

        String originalFilename = multipartFile.getOriginalFilename();

        //System.out.println("originalFilename:" + originalFilename);

        /*
        从原始文件名中获取后缀，后缀必须是 png /jpg /jpeg /gif
        作为新添加的文件的文件名后缀(匹配)
         */
        String subfix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        System.out.println("subfix:" + subfix); //输出文件后缀
        if (!(subfix.equals("png") || subfix.equals("jpg") || subfix.equals("jpeg") || subfix.equals("gif"))) {
            throw new CustomerException("只能上传png，jpg，jpeg，gif格式的图片");
        }

        //在springboot中，然后把上传的文件保存在指定的位置

        //在目标文件中与真实路径中做一个映射

        //使用UUID作为文件名,保证服务器中存放的文件名唯一
        String targetFile = UUID.randomUUID().toString().replace("-", "") + "." + subfix;
        System.out.println("targetFile:" + targetFile); //输出目标文件名

        //上传到Linux 服务器
        String fileName = "/usr/upload/img/" + targetFile;

        System.out.println("fileName:" + fileName);  //输出文件完整地址

        // 构建文件对象
        File uploadFile = new File(fileName);
        //核心操作(含有异常操作, 利用异常设定状态码(和前端约定)
        // 此处应当和ExceptionController结合, 当try执行成功则设定状态码0
        // 出现异常则设定其他
        // 再将异常信息结合BusinessException抛出, 交给ExceptionController处理
        try {
            multipartFile.transferTo(uploadFile);
        } catch (Exception e) {
            e.printStackTrace();
            //throw e;
        }
        JsonResult jsonResult = new JsonResult();

        String lu = "http://106.14.39.205:8770/tiankun-api-admin/img/" + targetFile;

        // 返回状态:0 表示上传成功
        jsonResult.setCode("0");
        // 返回服务器保存后的文件名
        jsonResult.put("fileName", lu);
        //jsonResult.setData(fileName);
        return jsonResult.getValues();
    }

}
